개요
이 글의 전반부에서는 Unreal Engine (UE)에서 메모리 최적화를 위한 유용한 명령어와 도구들을 소개합니다. 후반부에서는 이러한 명령어와 도구들을 활용해 UE에서 메모리를 최적화하는 방법을 설명합니다.
이 글과 함께 제공되는 다양한 참조 기사 및 비디오들을 결합하면 더 깊이 있는 이해를 도울 수 있습니다.
환경
- Unreal Engine 5.4
주요 내용
메모리 최적화의 목적
- 성능 향상
효율적인 메모리 관리는 프레임 속도 및 전반적인 게임 성능을 향상시킵니다. - 메모리 부족으로 인한 충돌 해결
- 로드 시간 단축
최적화된 텍스처와 자산은 로드 시간을 단축시킵니다.
유용한 UE 메모리 관리 명령어 및 도구
stat memory
- 명령어:
stat memory
게임 화면에서 메모리 사용량을 타입별로 표시합니다.
Memreport
- 명령어:
memreport -full
메모리 리포트를 덤프 파일로 저장합니다. - 명령어:
memreport -log
메모리 리포트를 로그에 표시합니다.
Memreport 참조:
Qiita: Memreport로 메모리 누수 원인 분석하기 (ja)
Ari's Unreal Engine Notes: 메모리 누수 디버깅
[UE4] Memreport 활용하기! (ja)
Memreport 예시
-
전체 메모리 사용량 표시
- 덤프 파일에서 "Physical Memory"를 검색하여 이 정보를 확인할 수 있습니다.
- 덤프 파일에서 "Physical Memory"를 검색하여 이 정보를 확인할 수 있습니다.
-
메모리 사용량에 따른 텍스처 목록 (내림차순)
- 덤프 파일에서 "listtextures"를 검색하여 이 데이터를 확인할 수 있습니다.
- 덤프 파일에서 "listtextures"를 검색하여 이 데이터를 확인할 수 있습니다.
객체 목록 명령어
- 명령어:
obj list
현재 존재하는 객체를 나열합니다. - 명령어:
obj list name=
이름으로 객체를 검색합니다. - 명령어:
obj refs name=
객체의 참조를 이름으로 표시합니다.
Obj List 참조 기사:
Obj List는 아래 이미지와 같이 표시됩니다:
가비지 컬렉션(GC) 명령어
- 명령어:
obj gc
가비지 컬렉션을 한 번 실행합니다. - 명령어:
gc.ForceCollectGarbageEveryFrame 1
매 프레임마다 가비지 컬렉션을 강제로 실행합니다. - 명령어:
gc.ForceCollectGarbageEveryFrame 0
매 프레임마다 가비지 컬렉션을 강제로 실행하는 것을 중지합니다.
가비지 컬렉션(GC)을 통해 자산을 해제하거나 참조를 확인할 수 있습니다.
프레임마다 강제로 GC를 실행하면 게임이 느려질 수 있으므로 조사 목적 외에는 사용하지 않는 것이 좋습니다.
GC 참조:
Low-Level Memory Tracker (LLM)
- 명령어:
stat llm
Low-Level Memory Tracker를 사용하여 메모리 사용량을 추적합니다.
자세한 내용은 아래의 참조를 참조하세요.
LLM 참조:
참조 뷰어
이 도구는 다른 자산을 참조하거나 참조하는 자산의 그래프를 표시합니다.
UE에서 자산을 우클릭하고 "Reference Viewer"를 선택하여 사용할 수 있습니다.
로드되지 말아야 할 자산이 예기치 않게 로드되는지 조사할 때 유용합니다.
사이즈 맵
UE에서 자산을 우클릭 -> "Size Map" -> 오른쪽 상단에서 "Memory" 선택.
모든 참조된 자산들의 총 메모리 사용량을 표시합니다.
사이즈 맵 참조:
메모리 인사이트
- 시간에 따른 메모리 할당 및 해제 분석 도구
예시: 시간 A -> 시간 B 메모리 할당 123.456MB
메모리 인사이트 참조:
Qiita: UE4 메모리 인사이트로 메모리 추적하기 (ja)
메모리 누수 조사를 위한 메모리 인사이트 비디오 (34:38): Unreal Fest 2022에서 게임 성능 극대화
메모리 조사 및 최적화 접근 방식
메모리 최적화 흐름은 일반적으로 아래 단계를 따릅니다:
메모리 문제 식별
충돌 로그나 메모리 경고를 찾아봅니다.
데이터 수집
stat memory
, memreport
, 메모리 인사이트 및 UE 외부의 다른 프로파일러 도구를 사용하여 메모리 사용량을 조사합니다:
- 실제 장치나 패키지된 버전에서 조사해야 합니다.
- PIE 모드에서는 미리 로드된 캐시 및 백그라운드 작업이 측정에 영향을 미쳐 정확한 결과를 얻기 어려울 수 있습니다.
- 메모리 사용량은 장치마다 다릅니다.
전체 메모리 사용량 확인
전체 메모리 사용량을 확인하려면 최소 500MB의 물리적 메모리가 남아 있는지 확인하는 것이 좋습니다.
memreport -full
을 사용하여 확인합니다:
- Memreport의 일부: 전체 메모리 사용량을 표시합니다.
- 덤프 파일에서 "Physical Memory"를 검색하여 이 정보를 찾을 수 있습니다.
텍스처 메모리 사용량 확인
listtextures nonvt
보고서를 표시하여 텍스처 메모리 사용량을 확인할 수 있습니다 (크기 순으로 정렬됨).
memreport -full
을 사용하여 확인합니다:
- Memreport의 일부: 텍스처를 메모리 사용량 내림차순으로 표시합니다.
- 덤프 파일에서 "listtextures"를 검색하여 이 정보를 확인할 수 있습니다.
데이터 분석
높은 메모리 사용량을 보이는 리소스를 식별합니다 (예: 텍스처, 재질).
불필요하거나 지나치게 큰 자산을 조사합니다.
불필요한 자산이 로드되었는지 조사하려면:
obj list name=
명령어로 자산 이름을 검색하고 로드되었는지 확인합니다.
예시: obj list name=T_SomeTexture
obj refs name=
명령어로 주어진 자산을 참조하는 객체를 표시하여 자산이 왜 로드되었는지 알 수 있습니다.
예시: obj refs name=T_SomeTexture
또한 참조 뷰어를 사용하여 참조의 출처를 추적하고 강한 참조가 어떻게 이루어졌는지 조사할 수 있습니다.
강한 참조와 약한 참조에 대해 더 알고 싶다면:
개선 사항 제안
- 불필요한 자산 삭제하거나 로드되지 않도록 설정합니다.
- 큰 텍스처의 해상도를 줄이거나 압
개선 사항 제안
- 불필요한 자산 삭제하거나 로드되지 않도록 설정합니다.
- 큰 텍스처의 해상도를 줄이거나 압축 설정을 조정합니다.
- 데이터 분석에 따라 다른 조정 사항을 적용합니다:
- 예: 모바일 게임에서는 조명 설정을 조정하면 메모리 사용을 줄일 수 있습니다.
압축 형식에 대한 참고 자료:
텍스처 최적화:
개선 사항 구현
문제가 있는 자산을 수정하거나 로드되지 않도록 설정합니다.
- 불필요한 자산 삭제:
- 하드 참조를 제거합니다.
- 더 이상 사용되지 않는 자산을 해제합니다:
- 하드 참조를 소프트 참조로 변경하고, 해제되어야 할 때
nullptr
로 설정하여 다음 GC 실행 시 자산이 해제되도록 합니다.
- 하드 참조를 소프트 참조로 변경하고, 해제되어야 할 때
- 큰 텍스처의 해상도를 줄이거나 압축 설정을 조정합니다.
- 필요한 경우 다른 조정을 적용합니다.
검증
최적화 전후의 메모리 사용량을 memreport
로 비교합니다.
문제가 있는 자산이 더 이상 로드되지 않는지 확인하는 방법
GC를 강제로 실행하려면 gc.ForceCollectGarbageEveryFrame 1
또는 obj gc
명령을 사용할 수 있습니다.
자산이 더 이상 참조되지 않으면 (소프트 참조에 대해 nullptr
을 설정하여) 이 시점에서 강제로 GC를 실행할 수 있습니다. 또한 obj list name=
명령을 사용하여 자산이 여전히 로드되어 있는지 확인할 수 있습니다. 여전히 로드되어 있다면 이는 남아 있는 참조가 있다는 의미이므로 다시 데이터를 분석해야 합니다.
메모리 사용 변화 비교
전체 메모리 사용량을 확인하고 최적화나 조정 후의 변화를 비교하려면 memreport -full
또는 memreport -log
명령을 사용합니다.
메모리 최적화의 핵심 사항
- 메모리 누수를 방지하는 습관을 개발하고, 자산이 제대로 해제되었는지 확인합니다.
- 참조된 모든 객체를 로드하는 하드 참조에 주의합니다.
- 가능하다면 소프트 참조를 사용합니다.
- 메모리 사용을 지속적으로 모니터링하여 개선합니다.
요약
- 메모리 최적화의 중요성
성능 향상, 로드 시간 단축 및 메모리 부족으로 인한 충돌 방지를 목표로 합니다. - 유용한 명령어 및 도구
stat memory
memreport -log
,memreport -full
obj list
,obj refs name=
obj gc
,gc.ForceCollectGarbageEveryFrame
- LLM
- 참조 뷰어
- 사이즈 맵
- 메모리 인사이트
- 최적화 프로세스
문제를 식별하고, 데이터를 수집하고, 분석하고, 개선 사항을 제안하고, 수정 사항을 구현하고, 검증합니다.
개선 사항의 예
- 불필요한 자산 삭제하거나 로드되지 않도록 설정
- 큰 텍스처의 해상도를 줄이거나 압축 설정을 조정
- 데이터 분석에 따라 다른 조정 사항을 적용
메모리 부족으로 인한 충돌이 발생했을 때 이 기사가 도움이 되기를 바랍니다.
오류가 있을 경우 댓글로 알려주시면 수정하겠습니다.
참고자료
- Qiita: 메모리 누수 원인 조사 (ja)
- Ari의 Unreal Engine 메모: 메모리 누수 디버깅
- [UE4] Memreport 효과적인 사용법 (ja)
- [UE4] Obj 명령을 사용한 객체 분석 (ja)
- 공식 문서: Unreal Engine에서 객체 처리 (ja)
- 【UE5】GC 강제 실행 (ja)
- 【UE4】UObject의 PendingKill에 대하여 | Hexadrive
- 공식 문서: Low-Level Memory Tracker (ja)
- [UE4] LLM을 사용한 메모리 추적 (ja)
- 공식 문서: Unreal Engine의 참조 뷰어 (ja)
- 비디오: Unreal Engine 5에서 메모리 최적화하는 방법
- Qiita: UE4 메모리 인사이트를 사용한 메모리 추적 (ja)
- 공식 문서: Unreal Engine의 메모리 인사이트 (ja)
- 비디오: Unreal Fest 2022에서 게임 성능 최적화 (Unreal Engine)
- 하드 참조 및 소프트 참조에 대해 (ja)
- BP 참조 체인 끊는 방법 (ja)
- 텍스처 형식에 대하여 (ja)
- [UE5] 이미지 압축 형식 (ja)
- 비디오: Unreal Engine 5에서 모바일용 텍스처 최적화
- 디버깅 및 메모리 최적화 (ja)
- UE5의 기본 Mipmap 설정 (ja)